package com.example.kotlindemo.modules.todolist

import android.app.AlertDialog
import android.os.Bundle
import android.view.LayoutInflater
import android.view.View
import android.view.ViewGroup
import android.widget.EditText
import androidx.fragment.app.Fragment
import androidx.fragment.app.activityViewModels
import androidx.recyclerview.widget.RecyclerView
import com.example.kotlindemo.R
import com.example.kotlindemo.adapter.PendingTaskAdapter
import com.example.kotlindemo.data.Task


// Model 到 ViewModel：
// TaskDao 提供 LiveData<List<Task>>，通过查询数据库获取未完成和已完成任务。
// TaskRepository 直接将 TaskDao 的 LiveData 暴露给 ViewModel，无需额外处理。
// TodoListViewModel 持有 pendingTasks 和 completedTasks 的 LiveData，供 Fragment 观察。

// ViewModel 到 View：
// PendingTasksFragment 通过 viewModel.pendingTasks.observe 订阅 pendingTasks 的变化。
// 每次 pendingTasks 数据更新，pendingTaskAdapter.submitList(tasks) 被调用，将新数据传递给适配器。
// PendingTaskAdapter 使用 ListAdapter 的 DiffUtil（TaskDiffCallback）计算数据差异，高效更新 RecyclerView。

// LiveData：Room 的 LiveData 查询（如 getPendingTasks）会自动监听数据库变化，当数据更新时通知观察者。
// ListAdapter：通过 DiffUtil 高效比较新旧数据，仅更新变化的部分，避免整个列表刷新。
// ViewModelScope：确保数据库操作异步执行，不会阻塞 UI 线程。
// Fragment 的 LifecycleOwner：observe(viewLifecycleOwner) 确保 LiveData 仅在 Fragment 可见时更新，避免内存泄漏。


// 初始化：
// AppDatabase -> TaskDao -> TaskRepository -> TodoListViewModel -> PendingTasksFragment。
// LiveData 从数据库查询绑定到 Fragment 的 RecyclerView。
// 用户操作：
// 用户交互（如点击完成） -> Fragment -> ViewModel -> Repository -> TaskDao -> 数据库。
// 数据库更新触发 LiveData 变化 -> ViewModel -> Fragment -> Adapter -> RecyclerView。
// 响应式更新：
// Room 的 LiveData 自动监听数据库变化。
// Fragment 观察 ViewModel 的 LiveData，调用 ListAdapter 更新 UI。


class PendingTasksFragment : Fragment() {

    private val viewModel: TodoListViewModel by activityViewModels() // 获取 viewModel
    private lateinit var pendingTaskAdapter: PendingTaskAdapter
    private lateinit var recyclerView: RecyclerView

    override fun onCreateView(
        inflater: LayoutInflater, container: ViewGroup?,
        savedInstanceState: Bundle?
    ): View? {
        // PendingTasksFragment 在 onCreateView 中加载布局（包含 RecyclerView）。
        val view = inflater.inflate(R.layout.fragment_pending_tasks, container, false)
        recyclerView = view.findViewById(R.id.rvPendingTasks)
        return view
    }

    override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
        super.onViewCreated(view, savedInstanceState)
        // 创建 PendingTaskAdapter，设置 RecyclerView 的适配器。
        // 观察 viewModel.pendingTasks 的 LiveData。
        setupRecyclerView()
        observeViewModel()
    }

    private fun setupRecyclerView() {
        pendingTaskAdapter = PendingTaskAdapter(
            onCheckClicked = { task ->
                // 点击待办项的对勾 -> 标记为完成
                viewModel.completeTask(task)
            },
            onEditClicked = { task ->
                // 点击编辑按钮 -> 显示编辑对话框
                showEditTaskDialog(task)
            }
        )
        recyclerView.adapter = pendingTaskAdapter
        // LayoutManager 已在 XML 中设置
        // recyclerView.layoutManager = LinearLayoutManager(context)

        // 添加默认的 ItemAnimator 以支持动画
        // recyclerView.itemAnimator = DefaultItemAnimator() // ListAdapter 默认会使用
    }

    private fun observeViewModel() {
        viewModel.pendingTasks.observe(viewLifecycleOwner) { tasks ->
            pendingTaskAdapter.submitList(tasks)
        }
    }

    // 显示编辑任务名称的对话框
    private fun showEditTaskDialog(task: Task) {
        val editText = EditText(requireContext()).apply {
            setText(task.name)
            setSelection(task.name.length) // 光标移到末尾
        }

        AlertDialog.Builder(requireContext())
            .setTitle(R.string.edit_task_title)
            .setView(editText)
            .setPositiveButton(R.string.save) { dialog, _ ->
                val newName = editText.text.toString().trim()
                if (newName.isNotEmpty()) {
                    viewModel.updateTaskName(task, newName)
                }
                dialog.dismiss()
            }
            .setNegativeButton(R.string.cancel) { dialog, _ ->
                dialog.cancel()
            }
            .show()
    }


    companion object {
        @JvmStatic
        fun newInstance() = PendingTasksFragment()
    }
}